React Flight ํ๋กํ ์ฝ ์ฌ์ธต ๋ถ์. ์ด ์ง๋ ฌํ ํ์์ด ์ด๋ป๊ฒ React ์๋ฒ ์ปดํฌ๋ํธ(RSC), ์คํธ๋ฆฌ๋ฐ, ๊ทธ๋ฆฌ๊ณ ์๋ฒ ์ฃผ๋ UI์ ๋ฏธ๋๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋์ง ์์๋ณด์ธ์.
React Flight ํํค์น๊ธฐ: ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ๋ํ๋ ์ง๋ ฌํ ํ๋กํ ์ฝ
์น ๊ฐ๋ฐ์ ์ธ๊ณ๋ ๋์์์ด ์งํํ๊ณ ์์ต๋๋ค. ์๋ ๋์ ์ง๋ฐฐ์ ์ธ ํจ๋ฌ๋ค์์ ํด๋ผ์ด์ธํธ์ ์ต์ํ์ HTML ์ ธ์ ๋ณด๋ธ ๋ค์, ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ JavaScript๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฒด ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ ๋๋งํ๋ ์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ (SPA)์ด์์ต๋๋ค. ์ด ๋ชจ๋ธ์ ๊ฐ๋ ฅํ์ง๋ง, ํฐ ๋ฒ๋ค ํฌ๊ธฐ, ํด๋ผ์ด์ธํธ-์๋ฒ ๋ฐ์ดํฐ ํญํฌ ํ์, ๋ณต์กํ ์ํ ๊ด๋ฆฌ์ ๊ฐ์ ๋ฌธ์ ์ ์ ์ผ๊ธฐํ์ต๋๋ค. ์ด์ ๋ํ ๋์์ผ๋ก, ์ปค๋ฎค๋ํฐ๋ ํ๋์ ์ธ ๊ฐ๊ฐ์ ๋ํ ์๋ฒ ์ค์ฌ ์ํคํ ์ฒ๋ก์ ์ค์ํ ํ๊ท๋ฅผ ๋ชฉ๊ฒฉํ๊ณ ์์ต๋๋ค. ์ด ์งํ์ ์ต์ ์ ์๋ React ํ์ด ๋ด๋์ ํ๊ธฐ์ ์ธ ๊ธฐ๋ฅ์ธ React ์๋ฒ ์ปดํฌ๋ํธ(RSC)๊ฐ ์์ต๋๋ค.
ํ์ง๋ง ์๋ฒ์์๋ง ๋ ์ ์ ์ผ๋ก ์คํ๋๋ ์ด ์ปดํฌ๋ํธ๋ค์ ์ด๋ป๊ฒ ๋ง๋ฒ์ฒ๋ผ ๋ํ๋ ํด๋ผ์ด์ธํธ ์ธก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋งค๋๋ฝ๊ฒ ํตํฉ๋ ์ ์์๊น์? ๊ทธ ํด๋ต์ ๋ ์๋ ค์ก์ง๋ง ๋งค์ฐ ์ค์ํ ๊ธฐ์ ์ธ React Flight์ ์์ต๋๋ค. ์ด๊ฒ์ ์ฌ๋ฌ๋ถ์ด ๋งค์ผ ์ง์ ์ฌ์ฉํ API๋ ์๋์ง๋ง, ์ด๋ฅผ ์ดํดํ๋ ๊ฒ์ ํ๋ React ์ํ๊ณ์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ํ์ฉํ๋ ์ด์ ์ ๋๋ค. ์ด ๊ธ์์๋ React Flight ํ๋กํ ์ฝ์ ์ฌ์ธต์ ์ผ๋ก ํํค์ณ ์ฐจ์ธ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ๋ํ๋ ์์ง์ ๋น๋ฐ์ ๋ฐํ๋ณด๊ฒ ์ต๋๋ค.
React ์๋ฒ ์ปดํฌ๋ํธ๋ ๋ฌด์์ธ๊ฐ? ๊ฐ๋จํ ๋ณต์ต
ํ๋กํ ์ฝ์ ๋ถ์ํ๊ธฐ ์ ์, React ์๋ฒ ์ปดํฌ๋ํธ๊ฐ ๋ฌด์์ด๊ณ ์ ์ค์ํ์ง ๊ฐ๋จํ ๋ณต์ตํด ๋ณด๊ฒ ์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ ๊ธฐ์กด์ React ์ปดํฌ๋ํธ์ ๋ฌ๋ฆฌ, RSC๋ ์๋ฒ์์๋ง ๋ ์ ์ ์ผ๋ก ์คํ๋๋๋ก ์ค๊ณ๋ ์๋ก์ด ์ ํ์ ์ปดํฌ๋ํธ์ ๋๋ค. ์ด๋ค์ ์ ๋๋ก JavaScript ์ฝ๋๋ฅผ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด์ง ์์ต๋๋ค.
์ด๋ฌํ ์๋ฒ ์ ์ฉ ์คํ์ ๋ช ๊ฐ์ง ํ๊ธฐ์ ์ธ ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ์ ๋ก ๋ฒ๋ค ์ฌ์ด์ฆ: ์ปดํฌ๋ํธ์ ์ฝ๋๊ฐ ์๋ฒ๋ฅผ ๋ ๋์ง ์๊ธฐ ๋๋ฌธ์, ํด๋ผ์ด์ธํธ ์ธก JavaScript ๋ฒ๋ค์ ์ ํ ๊ธฐ์ฌํ์ง ์์ต๋๋ค. ์ด๋ ํนํ ๋ณต์กํ๊ณ ๋ฐ์ดํฐ๊ฐ ๋ง์ ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ ์ฑ๋ฅ ๋ฉด์์ ์์ฒญ๋ ์ด์ ์ ๋๋ค.
- ์ง์ ์ ์ธ ๋ฐ์ดํฐ ์ ๊ทผ: RSC๋ API ์๋ํฌ์ธํธ๋ฅผ ๋ ธ์ถํ ํ์ ์์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค, ํ์ผ ์์คํ ๋๋ ๋ด๋ถ ๋ง์ดํฌ๋ก์๋น์ค์ ๊ฐ์ ์๋ฒ ์ธก ๋ฆฌ์์ค์ ์ง์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ด๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๋จ์ํํ๊ณ ํด๋ผ์ด์ธํธ-์๋ฒ ์์ฒญ ํญํฌ ํ์์ ์ ๊ฑฐํฉ๋๋ค.
- ์๋ ์ฝ๋ ๋ถํ : ์๋ฒ์์ ๋ ๋๋งํ ์ปดํฌ๋ํธ๋ฅผ ๋์ ์ผ๋ก ์ ํํ ์ ์๊ธฐ ๋๋ฌธ์, ํจ๊ณผ์ ์ผ๋ก ์๋ ์ฝ๋ ๋ถํ ์ ์ป์ ์ ์์ต๋๋ค. ์ํธ์์ฉ์ด ๊ฐ๋ฅํ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ์ฝ๋๋ง ๋ธ๋ผ์ฐ์ ๋ก ์ ์ก๋ฉ๋๋ค.
RSC๋ฅผ ์๋ฒ ์ธก ๋ ๋๋ง(SSR)๊ณผ ๊ตฌ๋ณํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. SSR์ ์ ์ฒด React ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ฒ์์ HTML ๋ฌธ์์ด๋ก ๋ฏธ๋ฆฌ ๋ ๋๋งํฉ๋๋ค. ํด๋ผ์ด์ธํธ๋ ์ด HTML์ ๋ฐ์ ํ์ํ ๋ค์, ์ ์ฒด JavaScript ๋ฒ๋ค์ ๋ค์ด๋ก๋ํ์ฌ ํ์ด์ง๋ฅผ 'ํ์ด๋๋ ์ด์ 'ํ๊ณ ์ํธ์์ฉ์ด ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค. ๋ฐ๋ฉด, RSC๋ UI์ ํน๋ณํ๊ณ ์ถ์์ ์ธ ์ค๋ช (HTML์ด ์๋)์ผ๋ก ๋ ๋๋ง๋๋ฉฐ, ์ด๋ ํด๋ผ์ด์ธํธ๋ก ์คํธ๋ฆฌ๋ฐ๋์ด ๊ธฐ์กด ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ์ฌ์กฐ์ ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ํจ์ฌ ๋ ์ธ๋ถํ๋๊ณ ํจ์จ์ ์ธ ์ ๋ฐ์ดํธ ํ๋ก์ธ์ค๊ฐ ๊ฐ๋ฅํด์ง๋๋ค.
React Flight ์๊ฐ: ํต์ฌ ํ๋กํ ์ฝ
๊ทธ๋ ๋ค๋ฉด ์๋ฒ ์ปดํฌ๋ํธ๋ HTML์ด๋ ์์ฒด JavaScript๋ฅผ ๋ณด๋ด์ง ์๋๋ค๋ฉด ๋ฌด์์ ๋ณด๋ด๋ ๊ฒ์ผ๊น์? ๋ฐ๋ก ์ฌ๊ธฐ์ React Flight๊ฐ ๋ฑ์ฅํฉ๋๋ค. React Flight๋ ๋ ๋๋ง๋ React ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ์ ์กํ๊ธฐ ์ํด ํน๋ณํ ์ ์๋ ์ง๋ ฌํ ํ๋กํ ์ฝ์ ๋๋ค.
React ๊ธฐ๋ณธ ์์๋ฅผ ์ดํดํ๋ ํน์ํ๊ณ ์คํธ๋ฆฌ๋ฐ ๊ฐ๋ฅํ JSON ๋ฒ์ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค. ์ด๋ ์๋ฒ ํ๊ฒฝ๊ณผ ์ฌ์ฉ์ ๋ธ๋ผ์ฐ์ ์ฌ์ด์ ๊ฐ๊ทน์ ๋ฉ์ฐ๋ '์ ์ก ํ์(wire format)'์ ๋๋ค. RSC๋ฅผ ๋ ๋๋งํ ๋, React๋ HTML์ ์์ฑํ์ง ์์ต๋๋ค. ๋์ React Flight ํ์์ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์์ฑํฉ๋๋ค.
์ ๊ทธ๋ฅ HTML์ด๋ JSON์ ์ฌ์ฉํ์ง ์๋๊ฐ?
๋น์ฐํ ์ง๋ฌธ์, ์ ์์ ํ ์๋ก์ด ํ๋กํ ์ฝ์ ๋ฐ๋ช ํ๋๊ฐ ํ๋ ๊ฒ์ ๋๋ค. ์ ๊ธฐ์กด ํ์ค์ ์ฌ์ฉํ ์ ์์์๊น์?
- ์ HTML์ ์ ๋๋๊ฐ? HTML์ ๋ณด๋ด๋ ๊ฒ์ SSR์ ์์ญ์ ๋๋ค. HTML์ ๋ฌธ์ ๋ ๊ทธ๊ฒ์ด ์ต์ข ์ ์ธ ํํ์ด๋ผ๋ ์ ์ ๋๋ค. ์ปดํฌ๋ํธ ๊ตฌ์กฐ์ ์ปจํ ์คํธ๋ฅผ ์์ด๋ฒ๋ฆฝ๋๋ค. ์ ์ฒด ํ์ด์ง ์๋ก๊ณ ์นจ์ด๋ ๋ณต์กํ DOM ์กฐ์ ์์ด๋ ์คํธ๋ฆฌ๋ฐ๋ ์๋ก์ด HTML ์กฐ๊ฐ์ ๊ธฐ์กด์ ์ํธ์์ฉ์ ์ธ ํด๋ผ์ด์ธํธ ์ธก React ์ฑ์ ์ฝ๊ฒ ํตํฉํ ์ ์์ต๋๋ค. React๋ ์ด๋ค ๋ถ๋ถ์ด ์ปดํฌ๋ํธ์ธ์ง, ๊ทธ๋ค์ props๊ฐ ๋ฌด์์ธ์ง, ๊ทธ๋ฆฌ๊ณ ์ํธ์์ฉ์ ์ธ '์์ผ๋๋'(ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ)๊ฐ ์ด๋์ ์์นํ๋์ง ์์์ผ ํฉ๋๋ค.
- ์ ํ์ค JSON์ ์ ๋๋๊ฐ? JSON์ ๋ฐ์ดํฐ์๋ ํ๋ฅญํ์ง๋ง, UI ์ปดํฌ๋ํธ, JSX, ๋๋ Suspense ๊ฒฝ๊ณ์ ๊ฐ์ ๊ฐ๋ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํํํ ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ๋ํ๋ด๋ JSON ์คํค๋ง๋ฅผ ๋ง๋ค๋ ค๊ณ ์๋ํ ์๋ ์๊ฒ ์ง๋ง, ๊ทธ๊ฒ์ ์ฅํฉํ๊ณ ํด๋ผ์ด์ธํธ์์ ๋์ ์ผ๋ก ๋ก๋๋๊ณ ๋ ๋๋ง๋์ด์ผ ํ๋ ์ปดํฌ๋ํธ๋ฅผ ์ด๋ป๊ฒ ํํํ ๊ฒ์ธ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ ๊ฒ์ ๋๋ค.
React Flight๋ ์ด๋ฌํ ํน์ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์ค๊ณ๋์์ต๋๋ค:
- ์ง๋ ฌํ ๊ฐ๋ฅ(Serializable): props์ ์ํ๋ฅผ ํฌํจํ ์ ์ฒด ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ํํํ ์ ์์ด์ผ ํฉ๋๋ค.
- ์คํธ๋ฆฌ๋ฐ ๊ฐ๋ฅ(Streamable): UI๋ฅผ ์ฒญํฌ ๋จ์๋ก ๋ณด๋ผ ์ ์์ด, ํด๋ผ์ด์ธํธ๊ฐ ์ ์ฒด ์๋ต์ ๋ฐ๊ธฐ ์ ์ ๋ ๋๋ง์ ์์ํ ์ ์์ต๋๋ค. ์ด๋ Suspense์์ ํตํฉ์ ํ์์ ์ ๋๋ค.
- React ์ธ์(React-Aware): ์ปดํฌ๋ํธ, ์ปจํ ์คํธ, ํด๋ผ์ด์ธํธ ์ธก ์ฝ๋์ ์ง์ฐ ๋ก๋ฉ(lazy-loading)๊ณผ ๊ฐ์ React ๊ฐ๋ ์ ์ผ๊ธ์ผ๋ก ์ง์ํฉ๋๋ค.
React Flight ์๋ ๋ฐฉ์: ๋จ๊ณ๋ณ ๋ถ์
React Flight๋ฅผ ์ฌ์ฉํ๋ ๊ณผ์ ์ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ์กฐ์จ๋ ์ถค๊ณผ ๊ฐ์ต๋๋ค. RSC๋ฅผ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ฒญ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋ฐ๋ผ๊ฐ ๋ณด๊ฒ ์ต๋๋ค.
์๋ฒ์์
- ์์ฒญ ์์: ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ํ์ด์ง(์: Next.js ์ฑ ๋ผ์ฐํฐ ํ์ด์ง)๋ก ์ด๋ํฉ๋๋ค.
- ์ปดํฌ๋ํธ ๋ ๋๋ง: React๊ฐ ํด๋น ํ์ด์ง์ ์๋ฒ ์ปดํฌ๋ํธ ํธ๋ฆฌ ๋ ๋๋ง์ ์์ํฉ๋๋ค.
- ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ: ํธ๋ฆฌ๋ฅผ ์ํํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ปดํฌ๋ํธ(์: `async function MyServerComponent() { ... }`)๋ฅผ ๋ง๋ฉ๋๋ค. ์ด๋ฌํ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค.
- Flight ์คํธ๋ฆผ์ผ๋ก ์ง๋ ฌํ: HTML์ ์์ฑํ๋ ๋์ , React ๋ ๋๋ฌ๋ ํ ์คํธ ์คํธ๋ฆผ์ ์์ฑํฉ๋๋ค. ์ด ํ ์คํธ๊ฐ React Flight ํ์ด๋ก๋์ ๋๋ค. ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ๊ฐ ๋ถ๋ถโ`div`, `p`, ํ ์คํธ ๋ฌธ์์ด, ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ๋ํ ์ฐธ์กฐโ์ด ์คํธ๋ฆผ ๋ด์ ํน์ ํ์์ผ๋ก ์ธ์ฝ๋ฉ๋ฉ๋๋ค.
- ์๋ต ์คํธ๋ฆฌ๋ฐ: ์๋ฒ๋ ์ ์ฒด ํธ๋ฆฌ๊ฐ ๋ ๋๋ง๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. UI์ ์ฒซ ๋ฒ์งธ ์ฒญํฌ๊ฐ ์ค๋น๋๋ ์ฆ์ HTTP๋ฅผ ํตํด ํด๋ผ์ด์ธํธ๋ก Flight ํ์ด๋ก๋ ์คํธ๋ฆฌ๋ฐ์ ์์ํฉ๋๋ค. Suspense ๊ฒฝ๊ณ๋ฅผ ๋ง๋๋ฉด ํ๋ ์ด์คํ๋๋ฅผ ๋ณด๋ด๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ค๋จ๋ ์ฝํ ์ธ ๋ ๋๋ง์ ๊ณ์ํ๋ฉฐ, ์ค๋น๊ฐ ๋๋ฉด ๋์ค์ ๋์ผํ ์คํธ๋ฆผ์ผ๋ก ์ ์กํฉ๋๋ค.
ํด๋ผ์ด์ธํธ์์
- ์คํธ๋ฆผ ์์ : ๋ธ๋ผ์ฐ์ ์ React ๋ฐํ์์ด Flight ์คํธ๋ฆผ์ ์์ ํฉ๋๋ค. ์ด๊ฒ์ ๋จ์ผ ๋ฌธ์๊ฐ ์๋๋ผ ์ฐ์์ ์ธ ๋ช ๋ น์ด์ ํ๋ฆ์ ๋๋ค.
- ํ์ฑ ๋ฐ ์ฌ์กฐ์ : ํด๋ผ์ด์ธํธ ์ธก React ์ฝ๋๊ฐ Flight ์คํธ๋ฆผ์ ์ฒญํฌ ๋จ์๋ก ํ์ฑํฉ๋๋ค. ์ด๊ฒ์ UI๋ฅผ ๊ตฌ์ถํ๊ฑฐ๋ ์ ๋ฐ์ดํธํ๊ธฐ ์ํ ์ค๊ณ๋๋ฅผ ๋ฐ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
- ํธ๋ฆฌ ์ฌ๊ตฌ์ฑ: ๊ฐ ๋ช ๋ น์ด์ ๋ํด React๋ ๊ฐ์ DOM์ ์ ๋ฐ์ดํธํฉ๋๋ค. ์๋ก์ด `div`๋ฅผ ๋ง๋ค๊ฑฐ๋, ํ ์คํธ๋ฅผ ์ฝ์ ํ๊ฑฐ๋, ๋๋ ๊ฐ์ฅ ์ค์ํ๊ฒ๋ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ์ํ ํ๋ ์ด์คํ๋๋ฅผ ์๋ณํ ์ ์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ๋ก๋ฉ: ์คํธ๋ฆผ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ("use client" ์ง์๋ฌธ์ผ๋ก ํ์๋จ)์ ๋ํ ์ฐธ์กฐ๊ฐ ํฌํจ๋์ด ์์ ๋, Flight ํ์ด๋ก๋์๋ ์ด๋ค JavaScript ๋ฒ๋ค์ ๋ค์ด๋ก๋ํด์ผ ํ๋์ง์ ๋ํ ์ ๋ณด๊ฐ ํฌํจ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด React๋ ํด๋น ๋ฒ๋ค์ด ์์ง ์บ์๋์ง ์์๋ค๋ฉด ๊ฐ์ ธ์ต๋๋ค.
- ํ์ด๋๋ ์ด์ ๋ฐ ์ํธ์์ฉ: ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ์ฝ๋๊ฐ ๋ก๋๋๋ฉด, React๋ ์ง์ ๋ ์์น์ ๋ ๋๋งํ๊ณ ํ์ด๋๋ ์ด์ ํ์ฌ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ถ์ด๊ณ ์์ ํ ์ํธ์์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค. ์ด ๊ณผ์ ์ ๋งค์ฐ ๋์์ด ๋ช ํํ๋ฉฐ ํ์ด์ง์ ์ํธ์์ฉ์ ์ธ ๋ถ๋ถ์ ๋ํด์๋ง ๋ฐ์ํฉ๋๋ค.
์ด ์คํธ๋ฆฌ๋ฐ ๋ฐ ์ ํ์ ํ์ด๋๋ ์ด์ ๋ชจ๋ธ์ ์ข ์ข ์ ์ฒด ํ์ด์ง์ "์ ๋ถ ์๋๋ฉด ์ ๋ฌด" ๋ฐฉ์์ ํ์ด๋๋ ์ด์ ์ ์๊ตฌํ๋ ๊ธฐ์กด SSR ๋ชจ๋ธ๋ณด๋ค ํจ์ฌ ๋ ํจ์จ์ ์ ๋๋ค.
React Flight ํ์ด๋ก๋ ํด๋ถ
React Flight๋ฅผ ์ง์ ์ผ๋ก ์ดํดํ๋ ค๋ฉด, ๊ทธ๊ฒ์ด ์์ฑํ๋ ๋ฐ์ดํฐ์ ํ์์ ์ดํด๋ณด๋ ๊ฒ์ด ๋์์ด ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด ์์ ์ถ๋ ฅ๊ณผ ์ง์ ์ํธ์์ฉํ์ง๋ ์๊ฒ ์ง๋ง, ๊ทธ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ ์ ์์ต๋๋ค. ํ์ด๋ก๋๋ ์ค๋ฐ๊ฟ์ผ๋ก ๊ตฌ๋ถ๋ JSON๊ณผ ์ ์ฌํ ๋ฌธ์์ด์ ์คํธ๋ฆผ์ ๋๋ค. ๊ฐ ์ค, ์ฆ ์ฒญํฌ๋ ์ ๋ณด์ ํ ์กฐ๊ฐ์ ๋ํ๋ ๋๋ค.
๊ฐ๋จํ ์๋ฅผ ๋ค์ด๋ณด๊ฒ ์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์๋ฒ ์ปดํฌ๋ํธ๊ฐ ์๋ค๊ณ ์์ํด ๋ณด์ธ์:
app/page.js (์๋ฒ ์ปดํฌ๋ํธ)
<!-- ์ค์ ๋ธ๋ก๊ทธ์ ์ฝ๋ ๋ธ๋ก์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค -->
async function Page() {
const userData = await fetchUser(); // { name: 'Alice' }๋ฅผ ๊ฐ์ ธ์ด
return (
<div>
<h1>Welcome, {userData.name}</h1>
<p>Here is your dashboard.</p>
<InteractiveButton text="Click Me" />
</div>
);
}
๊ทธ๋ฆฌ๊ณ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ:
components/InteractiveButton.js (ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ)
<!-- ์ค์ ๋ธ๋ก๊ทธ์ ์ฝ๋ ๋ธ๋ก์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค -->
'use client';
import { useState } from 'react';
export default function InteractiveButton({ text }) {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>
{text} ({count})
</button>
);
}
์ด UI์ ๋ํด ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ์ ์ก๋๋ React Flight ์คํธ๋ฆผ์ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค (์ดํด๋ฅผ ๋๊ธฐ ์ํด ๋จ์ํ๋จ):
<!-- Flight ์คํธ๋ฆผ์ ๋จ์ํ๋ ์์ -->
M1:{"id":"./components/InteractiveButton.js","chunks":["chunk-abcde.js"],"name":"default"}
J0:["$","div",null,{"children":[["$","h1",null,{"children":["Welcome, ","Alice"]}],["$","p",null,{"children":"Here is your dashboard."}],["$","@1",null,{"text":"Click Me"}]]}]
์ด ์ํธ ๊ฐ์ ์ถ๋ ฅ์ ๋ถ์ํด ๋ด ์๋ค:
- `M` ํ (๋ชจ๋ ๋ฉํ๋ฐ์ดํฐ): `M1:`์ผ๋ก ์์ํ๋ ์ค์ ๋ชจ๋ ์ฐธ์กฐ์ ๋๋ค. ํด๋ผ์ด์ธํธ์๊ฒ "ID `@1`์ด ์ฐธ์กฐํ๋ ์ปดํฌ๋ํธ๋ `./components/InteractiveButton.js` ํ์ผ์ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ(default export)์ ๋๋ค. ์ด๋ฅผ ๋ก๋ํ๋ ค๋ฉด JavaScript ํ์ผ `chunk-abcde.js`๋ฅผ ๋ค์ด๋ก๋ํด์ผ ํฉ๋๋ค."๋ผ๊ณ ์๋ ค์ค๋๋ค. ์ด๊ฒ์ด ๋์ ์ํฌํธ์ ์ฝ๋ ๋ถํ ์ด ์ฒ๋ฆฌ๋๋ ๋ฐฉ์์ ๋๋ค.
- `J` ํ (JSON ๋ฐ์ดํฐ): `J0:`์ผ๋ก ์์ํ๋ ์ค์ ์ง๋ ฌํ๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ํฌํจํฉ๋๋ค. ๊ทธ ๊ตฌ์กฐ๋ฅผ ์ดํด๋ณด๋ฉด: `["$","div",null,{...}]`์ ๋๋ค.
- `$` ๊ธฐํธ: ์ด๊ฒ์ React ์์(๋ณธ์ง์ ์ผ๋ก JSX)๋ฅผ ๋ํ๋ด๋ ํน๋ณํ ์๋ณ์์ ๋๋ค. ํ์์ ์ผ๋ฐ์ ์ผ๋ก `["$", type, key, props]`์ ๋๋ค.
- ์ปดํฌ๋ํธ ํธ๋ฆฌ ๊ตฌ์กฐ: HTML์ ์ค์ฒฉ ๊ตฌ์กฐ๋ฅผ ๋ณผ ์ ์์ต๋๋ค. `div`๋ `h1`, `p`, ๊ทธ๋ฆฌ๊ณ ๋ ๋ค๋ฅธ React ์์๋ฅผ ํฌํจํ๋ ๋ฐฐ์ด์ธ `children` prop์ ๊ฐ์ง๋๋ค.
- ๋ฐ์ดํฐ ํตํฉ: ์ด๋ฆ `"Alice"`๊ฐ ์คํธ๋ฆผ์ ์ง์ ํฌํจ๋์ด ์๋ ๊ฒ์ ์ฃผ๋ชฉํ์ธ์. ์๋ฒ์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๊ฒฐ๊ณผ๊ฐ UI ์ค๋ช ์ ๋ฐ๋ก ์ง๋ ฌํ๋ฉ๋๋ค. ํด๋ผ์ด์ธํธ๋ ์ด ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ๊ฐ์ ธ์์ก๋์ง ์ ํ์๊ฐ ์์ต๋๋ค.
- `@` ๊ธฐํธ (ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ์ฐธ์กฐ): ๊ฐ์ฅ ํฅ๋ฏธ๋ก์ด ๋ถ๋ถ์ `["$","@1",null,{"text":"Click Me"}]`์ ๋๋ค. `@1`์ ์ฐธ์กฐ์ ๋๋ค. ํด๋ผ์ด์ธํธ์๊ฒ "ํธ๋ฆฌ์ ์ด ์์น์, ๋ชจ๋ ๋ฉํ๋ฐ์ดํฐ `M1`์ ์ํด ์ค๋ช ๋ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋๋งํ ๋, `{ text: 'Click Me' }`์ ๊ฐ์ props๋ฅผ ์ ๋ฌํ์ธ์."๋ผ๊ณ ์๋ ค์ค๋๋ค.
์ด ํ์ด๋ก๋๋ ์์ ํ ์ง์นจ ์ธํธ์ ๋๋ค. ํด๋ผ์ด์ธํธ์๊ฒ UI๋ฅผ ์ด๋ป๊ฒ ๊ตฌ์ฑํด์ผ ํ๋์ง, ์ด๋ค ์ ์ ์ฝํ ์ธ ๋ฅผ ํ์ํด์ผ ํ๋์ง, ์ํธ์์ฉ ์ปดํฌ๋ํธ๋ฅผ ์ด๋์ ๋ฐฐ์นํด์ผ ํ๋์ง, ๊ทธ๋ค์ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๋ก๋ํด์ผ ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ค props๋ฅผ ์ ๋ฌํด์ผ ํ๋์ง๋ฅผ ์ ํํ ์๋ ค์ค๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ด ๊ฐ๊ฒฐํ๊ณ ์คํธ๋ฆฌ๋ฐ ๊ฐ๋ฅํ ํ์์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค.
React Flight ํ๋กํ ์ฝ์ ์ฃผ์ ์ด์
Flight ํ๋กํ ์ฝ์ ์ค๊ณ๋ RSC ํจ๋ฌ๋ค์์ ํต์ฌ ์ด์ ์ ์ง์ ์ ์ผ๋ก ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ํ๋กํ ์ฝ์ ์ดํดํ๋ฉด ์ด๋ฌํ ์ด์ ์ด ์ ๊ฐ๋ฅํ์ง ๋ช ํํด์ง๋๋ค.
์คํธ๋ฆฌ๋ฐ๊ณผ ๋ค์ดํฐ๋ธ Suspense
ํ๋กํ ์ฝ์ด ์ค๋ฐ๊ฟ์ผ๋ก ๊ตฌ๋ถ๋ ์คํธ๋ฆผ์ด๊ธฐ ๋๋ฌธ์, ์๋ฒ๋ UI๊ฐ ๋ ๋๋ง๋๋ ๋๋ก ๋ณด๋ผ ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ๊ฐ ์ค๋จ๋ ๊ฒฝ์ฐ(์: ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์ค), ์๋ฒ๋ ์คํธ๋ฆผ์ ํ๋ ์ด์คํ๋ ์ง์นจ์ ๋ณด๋ด๊ณ , ํ์ด์ง์ ๋๋จธ์ง UI๋ฅผ ๋ณด๋ธ ๋ค์, ๋ฐ์ดํฐ๊ฐ ์ค๋น๋๋ฉด ๋์ผํ ์คํธ๋ฆผ์ ์๋ก์ด ์ง์นจ์ ๋ณด๋ด ํ๋ ์ด์คํ๋๋ฅผ ์ค์ ์ฝํ ์ธ ๋ก ๊ต์ฒดํ ์ ์์ต๋๋ค. ์ด๋ ๋ณต์กํ ํด๋ผ์ด์ธํธ ์ธก ๋ก์ง ์์ด ์ผ๊ธ ์คํธ๋ฆฌ๋ฐ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
์๋ฒ ๋ก์ง์ ์ํ ์ ๋ก ๋ฒ๋ค ์ฌ์ด์ฆ
ํ์ด๋ก๋๋ฅผ ๋ณด๋ฉด, `Page` ์ปดํฌ๋ํธ ์์ฒด์ ์ฝ๋๊ฐ ์ ํ ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ก์ง, ๋ณต์กํ ๋น์ฆ๋์ค ๊ณ์ฐ, ๋๋ ์๋ฒ์์๋ง ์ฌ์ฉ๋๋ ๋๊ท๋ชจ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ ์์กด์ฑ๋ค์ด ์์ ํ ์์ต๋๋ค. ์คํธ๋ฆผ์ ๊ทธ ๋ก์ง์ *๊ฒฐ๊ณผ๋ฌผ*๋ง์ ํฌํจํฉ๋๋ค. ์ด๊ฒ์ด RSC์ "์ ๋ก ๋ฒ๋ค ์ฌ์ด์ฆ" ์ฝ์์ ๊ทผ๋ณธ์ ์ธ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ์ ์ฝ๋ก์ผ์ด์ (Colocation)
`userData` ๊ฐ์ ธ์ค๊ธฐ๋ ์๋ฒ์์ ๋ฐ์ํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ(`'Alice'`)๋ง์ด ์คํธ๋ฆผ์ผ๋ก ์ง๋ ฌํ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ค์ ๋ฐ์ดํฐ๊ฐ ํ์ํ ์ปดํฌ๋ํธ ๋ฐ๋ก ์์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ฐ, ์ด๋ฅผ ์ฝ๋ก์ผ์ด์ ์ด๋ผ๊ณ ํฉ๋๋ค. ์ด ํจํด์ ์ฝ๋๋ฅผ ๋จ์ํํ๊ณ , ์ ์ง๋ณด์์ฑ์ ํฅ์์ํค๋ฉฐ, ๋ง์ SPA๋ฅผ ๊ดด๋กญํ๋ ํด๋ผ์ด์ธํธ-์๋ฒ ํญํฌ ํ์์ ์ ๊ฑฐํฉ๋๋ค.
์ ํ์ ํ์ด๋๋ ์ด์
ํ๋กํ ์ฝ์ด ๋ ๋๋ง๋ HTML ์์์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ์ฐธ์กฐ(`@`)๋ฅผ ๋ช ์์ ์ผ๋ก ๊ตฌ๋ถํ๋ ๊ฒ์ด ์ ํ์ ํ์ด๋๋ ์ด์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ํด๋ผ์ด์ธํธ ์ธก React ๋ฐํ์์ `@` ์ปดํฌ๋ํธ๋ง์ด ์ํธ์์ฉ ๊ฐ๋ฅํด์ง๊ธฐ ์ํด ํด๋น JavaScript๊ฐ ํ์ํ๋ค๋ ๊ฒ์ ์๋๋ค. ํธ๋ฆฌ์ ์ ์ ์ธ ๋ถ๋ถ์ ๋ฌด์ํ ์ ์์ด, ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์ ์๋นํ ๊ณ์ฐ ๋ฆฌ์์ค๋ฅผ ์ ์ฝํ ์ ์์ต๋๋ค.
React Flight ๋ ๋์: ๊ธ๋ก๋ฒ ๊ด์
React Flight์ ํ์ ์ ์ ๋๋ก ํ๊ฐํ๋ ค๋ฉด, ์ ์ธ๊ณ ์น ๊ฐ๋ฐ ์ปค๋ฎค๋ํฐ์์ ์ฌ์ฉ๋๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์๊ณผ ๋น๊ตํ๋ ๊ฒ์ด ๋์์ด ๋ฉ๋๋ค.
vs. ์ ํต์ ์ธ SSR + ํ์ด๋๋ ์ด์
์ธ๊ธํ๋ฏ์ด, ์ ํต์ ์ธ SSR์ ์ ์ฒด HTML ๋ฌธ์๋ฅผ ๋ณด๋ ๋๋ค. ํด๋ผ์ด์ธํธ๋ ๊ทธ๋ฐ ๋ค์ ํฐ JavaScript ๋ฒ๋ค์ ๋ค์ด๋ก๋ํ๊ณ ์ ์ฒด ๋ฌธ์๋ฅผ "ํ์ด๋๋ ์ด์ "ํ์ฌ ์ ์ HTML์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ถ์ ๋๋ค. ์ด๋ ๋๋ฆฌ๊ณ ๋ถ์์ ํ ์ ์์ต๋๋ค. ๋จ ํ๋์ ์ค๋ฅ๊ฐ ์ ์ฒด ํ์ด์ง๊ฐ ์ํธ์์ฉ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. React Flight์ ์คํธ๋ฆฌ๋ฐ ๊ฐ๋ฅํ๊ณ ์ ํ์ ์ธ ํน์ฑ์ ์ด ๊ฐ๋ ์ ๋ ํ๋ ฅ์ ์ด๊ณ ์ฑ๋ฅ์ด ์ข์ ์งํ์ ๋๋ค.
vs. GraphQL/REST API
ํํ ํผ๋ ์ค ํ๋๋ RSC๊ฐ GraphQL์ด๋ REST์ ๊ฐ์ ๋ฐ์ดํฐ API๋ฅผ ๋์ฒดํ๋์ง ์ฌ๋ถ์ ๋๋ค. ๋ต์ '์๋์ค'์ ๋๋ค. ๊ทธ๋ค์ ์ํธ ๋ณด์์ ์ ๋๋ค. React Flight๋ UI ํธ๋ฆฌ๋ฅผ ์ง๋ ฌํํ๊ธฐ ์ํ ํ๋กํ ์ฝ์ด์ง, ๋ฒ์ฉ ๋ฐ์ดํฐ ์ฟผ๋ฆฌ ์ธ์ด๊ฐ ์๋๋๋ค. ์ฌ์ค, ์๋ฒ ์ปดํฌ๋ํธ๋ ์ข ์ข ์๋ฒ์์ GraphQL์ด๋ REST API๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ํ ๋ ๋๋งํฉ๋๋ค. ํต์ฌ ์ฐจ์ด์ ์ ์ด API ํธ์ถ์ด ์๋ฒ ๋ ์๋ฒ๋ก ๋ฐ์ํ์ฌ ์ผ๋ฐ์ ์ผ๋ก ํด๋ผ์ด์ธํธ ๋ ์๋ฒ ํธ์ถ๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ณ ์์ ํ๋ค๋ ๊ฒ์ ๋๋ค. ํด๋ผ์ด์ธํธ๋ ์์ ๋ฐ์ดํฐ๊ฐ ์๋ Flight ์คํธ๋ฆผ์ ํตํด ์ต์ข UI๋ฅผ ๋ฐ์ต๋๋ค.
vs. ๋ค๋ฅธ ํ๋ ํ๋ ์์ํฌ
๊ธ๋ก๋ฒ ์ํ๊ณ์ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ค๋ ์๋ฒ-ํด๋ผ์ด์ธํธ ๋ถํ ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด:
- Astro Islands: Astro๋ ์ ์ฌํ '์์ผ๋๋' ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฌ์ดํธ์ ๋๋ถ๋ถ์ ์ ์ HTML์ด๊ณ ์ํธ์์ฉ ์ปดํฌ๋ํธ๋ ๊ฐ๋ณ์ ์ผ๋ก ๋ก๋๋ฉ๋๋ค. ์ด ๊ฐ๋ ์ RSC ์ธ๊ณ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ์ ์ฌํฉ๋๋ค. ๊ทธ๋ฌ๋ Astro๋ ์ฃผ๋ก HTML์ ๋ณด๋ด๋ ๋ฐ๋ฉด, React๋ Flight๋ฅผ ํตํด ๊ตฌ์กฐํ๋ UI ์ค๋ช ์ ๋ณด๋ด ํด๋ผ์ด์ธํธ ์ธก React ์ํ์ ๋ ์ํํ๊ฒ ํตํฉํ ์ ์์ต๋๋ค.
- Qwik๊ณผ Resumability: Qwik์ ์ฌ๊ฐ ๊ฐ๋ฅ์ฑ(resumability)์ด๋ผ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ทจํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ์ํ๋ฅผ HTML์ ์ง๋ ฌํํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ ์์ ์ ์ฝ๋๋ฅผ ๋ค์ ์คํ(ํ์ด๋๋ ์ด์ )ํ ํ์๊ฐ ์๋๋ก ํฉ๋๋ค. ์๋ฒ๊ฐ ์ค๋จํ ์ง์ ์์ '์ฌ๊ฐ'ํ ์ ์์ต๋๋ค. React Flight์ ์ ํ์ ํ์ด๋๋ ์ด์ ์ ๋น์ทํ ๋น ๋ฅธ ์ํธ์์ฉ ์๊ฐ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๊ณ ์ ํ์ง๋ง, ํ์ํ ์ํธ์์ฉ ์ฝ๋๋ง ๋ก๋ํ๊ณ ์คํํ๋ ๋ค๋ฅธ ๋ฉ์ปค๋์ฆ์ ํตํด ์ด๋ฃจ์ด์ง๋๋ค.
๊ฐ๋ฐ์๋ฅผ ์ํ ์ค์ง์ ์ธ ์๋ฏธ์ ๋ชจ๋ฒ ์ฌ๋ก
React Flight ํ์ด๋ก๋๋ฅผ ์ง์ ์์ฑํ์ง๋ ์๊ฒ ์ง๋ง, ํ๋กํ ์ฝ์ ์ดํดํ๋ ๊ฒ์ ํ๋ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
`"use server"`์ `"use client"`๋ฅผ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ์ธ์
Next.js์ ๊ฐ์ ํ๋ ์์ํฌ์์, `"use client"` ์ง์๋ฌธ์ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ๊ฒฝ๊ณ๋ฅผ ์ ์ดํ๋ ์ฃผ์ ๋๊ตฌ์ ๋๋ค. ์ด๊ฒ์ ๋น๋ ์์คํ ์ ์ปดํฌ๋ํธ์ ๊ทธ ์์๋ค์ด ์ํธ์์ฉ ์์ผ๋๋๋ก ์ทจ๊ธ๋์ด์ผ ํ๋ค๋ ์ ํธ์ ๋๋ค. ๊ทธ ์ฝ๋๋ ๋ฒ๋ค๋ง๋์ด ๋ธ๋ผ์ฐ์ ๋ก ์ ์ก๋๊ณ , React Flight๋ ๊ทธ์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ง๋ ฌํํ ๊ฒ์ ๋๋ค. ๋ฐ๋๋ก, ์ด ์ง์๋ฌธ์ด ์๊ฑฐ๋(๋๋ ์๋ฒ ์ก์ ์ ์ํด `"use server"`๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ) ์ปดํฌ๋ํธ๋ ์๋ฒ์ ๋จ์์๊ฒ ๋ฉ๋๋ค. ํจ์จ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ค๋ฉด ์ด ๊ฒฝ๊ณ๋ฅผ ๋ง์คํฐํด์ผ ํฉ๋๋ค.
์๋ํฌ์ธํธ๊ฐ ์๋ ์ปดํฌ๋ํธ ๋จ์๋ก ์๊ฐํ์ธ์
RSC๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ ์์ฒด๊ฐ ๋ฐ์ดํฐ ์ปจํ
์ด๋๊ฐ ๋ ์ ์์ต๋๋ค. `/api/user`๋ผ๋ API ์๋ํฌ์ธํธ๋ฅผ ๋ง๋ค๊ณ ๊ทธ๊ฒ์ ๊ฐ์ ธ์ค๋ ํด๋ผ์ด์ธํธ ์ธก ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ๋์ , ๋ด๋ถ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋จ์ผ ์๋ฒ ์ปดํฌ๋ํธ `
๋ณด์์ ์๋ฒ ์ธก์ ๊ด์ฌ์ฌ์ ๋๋ค
RSC๋ ์๋ฒ ์ฝ๋์ด๋ฏ๋ก ์๋ฒ ๊ถํ์ ๊ฐ์ง๋๋ค. ์ด๊ฒ์ ๊ฐ๋ ฅํ์ง๋ง ๋ณด์์ ๋ํ ์๊ฒฉํ ์ ๊ทผ ๋ฐฉ์์ด ํ์ํฉ๋๋ค. ๋ชจ๋ ๋ฐ์ดํฐ ์ ๊ทผ, ํ๊ฒฝ ๋ณ์ ์ฌ์ฉ, ๋ด๋ถ ์๋น์ค์์ ์ํธ์์ฉ์ด ์ฌ๊ธฐ์ ์ผ์ด๋ฉ๋๋ค. ์ด ์ฝ๋๋ฅผ ๋ฐฑ์๋ API์ฒ๋ผ ์๊ฒฉํ๊ฒ ๋ค๋ฃจ์ญ์์ค: ๋ชจ๋ ์ ๋ ฅ์ ์ด๊ท ํ๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ์๋ ์ค๋น๋ ๋ฌธ์ ์ฌ์ฉํ๋ฉฐ, Flight ํ์ด๋ก๋๋ก ์ง๋ ฌํ๋ ์ ์๋ ๋ฏผ๊ฐํ ํค๋ ๋น๋ฐ์ ์ ๋ ๋ ธ์ถํ์ง ๋ง์ญ์์ค.
์๋ก์ด ์คํ ๋๋ฒ๊น ํ๊ธฐ
RSC ์ธ๊ณ์์๋ ๋๋ฒ๊น ์ด ๋ฌ๋ผ์ง๋๋ค. UI ๋ฒ๊ทธ๋ ์๋ฒ ์ธก ๋ ๋๋ง ๋ก์ง์ด๋ ํด๋ผ์ด์ธํธ ์ธก ํ์ด๋๋ ์ด์ ์์ ๋น๋กฏ๋ ์ ์์ต๋๋ค. ์๋ฒ ๋ก๊ทธ(RSC์ฉ)์ ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ์ฝ์(ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ฉ)์ ๋ชจ๋ ํ์ธํ๋ ๋ฐ ์ต์ํด์ ธ์ผ ํฉ๋๋ค. ๋คํธ์ํฌ ํญ๋ ๊ทธ ์ด๋ ๋๋ณด๋ค ์ค์ํด์ก์ต๋๋ค. ์์ Flight ์๋ต ์คํธ๋ฆผ์ ๊ฒ์ฌํ์ฌ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์ ํํ ๋ฌด์์ ๋ณด๋ด๊ณ ์๋์ง ํ์ธํ ์ ์์ผ๋ฉฐ, ์ด๋ ๋ฌธ์ ํด๊ฒฐ์ ๋งค์ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
React Flight์ ํจ๊ปํ๋ ์น ๊ฐ๋ฐ์ ๋ฏธ๋
React Flight์ ๊ทธ๊ฒ์ด ๊ฐ๋ฅํ๊ฒ ํ๋ ์๋ฒ ์ปดํฌ๋ํธ ์ํคํ ์ฒ๋ ์ฐ๋ฆฌ๊ฐ ์น์ ์ํด ๊ตฌ์ถํ๋ ๋ฐฉ์์ ๋ํ ๊ทผ๋ณธ์ ์ธ ์ฌ๊ณ ๋ฅผ ๋ํ๋ ๋๋ค. ์ด ๋ชจ๋ธ์ ๋ ์ธ๊ณ์ ์ฅ์ ์ ๊ฒฐํฉํฉ๋๋ค: ์ปดํฌ๋ํธ ๊ธฐ๋ฐ UI ๊ฐ๋ฐ์ ๋จ์ํ๊ณ ๊ฐ๋ ฅํ ๊ฐ๋ฐ์ ๊ฒฝํ๊ณผ ์ ํต์ ์ธ ์๋ฒ ๋ ๋๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ๋ฐ ๋ณด์.
์ด ๊ธฐ์ ์ด ์ฑ์ํจ์ ๋ฐ๋ผ, ์ฐ๋ฆฌ๋ ํจ์ฌ ๋ ๊ฐ๋ ฅํ ํจํด์ด ๋ํ๋ ๊ฒ์ผ๋ก ๊ธฐ๋ํ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๊ฐ ์๋ฒ์์ ์์ ํ ํจ์๋ฅผ ํธ์ถํ ์ ์๊ฒ ํด์ฃผ๋ ์๋ฒ ์ก์ ์ ์ด ์๋ฒ-ํด๋ผ์ด์ธํธ ํต์ ์ฑ๋ ์์ ๊ตฌ์ถ๋ ๊ธฐ๋ฅ์ ๋ํ์ ์ธ ์์ ๋๋ค. ํ๋กํ ์ฝ์ ํ์ฅ ๊ฐ๋ฅํ๋ฏ๋ก, React ํ์ ํต์ฌ ๋ชจ๋ธ์ ๊นจ์ง ์๊ณ ๋ ๋ฏธ๋์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
React Flight๋ React ์๋ฒ ์ปดํฌ๋ํธ ํจ๋ฌ๋ค์์ ๋ณด์ด์ง ์์ง๋ง ํ์์ ์ธ ์ค์ถ์ ๋๋ค. ์ด๊ฒ์ ์๋ฒ์์ ๋ ๋๋ง๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ํด๋ผ์ด์ธํธ ์ธก React ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ดํดํ๊ณ ํ๋ถํ๊ณ ์ํธ์์ฉ์ ์ธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์ง์นจ ์ธํธ๋ก ๋ณํํ๋ ๋งค์ฐ ์ ๋ฌธํ๋๊ณ ํจ์จ์ ์ด๋ฉฐ ์คํธ๋ฆฌ๋ฐ ๊ฐ๋ฅํ ํ๋กํ ์ฝ์ ๋๋ค. ์ปดํฌ๋ํธ์ ๊ทธ๋ค์ ๊ฐ๋น์ผ ์์กด์ฑ์ ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ์ด๋์ํด์ผ๋ก์จ, ๋ ๋น ๋ฅด๊ณ , ๋ ๊ฐ๋ณ๊ณ , ๋ ๊ฐ๋ ฅํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์๊ฒ React Flight๊ฐ ๋ฌด์์ด๊ณ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๋ ๊ฒ์ ๋จ์ง ํ๋ฌธ์ ์ธ ์ฐ์ต์ด ์๋๋๋ค. ์ด๋ ์ด ์๋ก์ด ์๋ฒ ์ฃผ๋ UI ์๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๊ณํ๊ณ , ์ฑ๋ฅ ํธ๋ ์ด๋์คํ๋ฅผ ๊ฒฐ์ ํ๋ฉฐ, ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํ๊ธฐ ์ํ ์ค์ํ ์ ์ ๋ชจ๋ธ์ ์ ๊ณตํฉ๋๋ค. ๋ณํ๋ ์งํ ์ค์ด๋ฉฐ, React Flight๋ ์์ผ๋ก ๋์๊ฐ ๊ธธ์ ๋ฆ๋ ํ๋กํ ์ฝ์ ๋๋ค.